home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GME / GMEBASE.I < prev    next >
Encoding:
Modula Implementation  |  1991-08-01  |  31.6 KB  |  1,127 lines

  1. IMPLEMENTATION MODULE GMEBase;
  2. (*$Y+*)
  3. (*$R-*)
  4. (*$Z+*)
  5.  
  6. (*    ACHTUNG! Dies Modul darf keine anderen GME-Module importieren! *)
  7.  
  8. (* (C) 1990 by Johannes Leckebusch
  9.    Stand: 12. 12. 90
  10. *)
  11.  
  12. (* !JL 11.12.90: "Puffer kann nicht gelöscht werden.107" entfernt! *)
  13. (*  TT 12.12.90: ConfigPuffer-Init nach GMEKernel verlegt
  14.                  DeleteTail optimiert
  15.     TT 13.12.90: Init: mit Aggregat; InitAES: Window wg. ACC-Redraw geöffnet;
  16.                  "REF" bei einigen String-Parametern eingesetzt.
  17.     TT 18.12.90: Alert-Meldungen mit "WrapAlert"
  18. *)
  19.  
  20.  
  21. (* Zusammenziehung von:
  22.    EditConst, EditTypes, KeyBase, ScreenBase, EditBefehle, EditBuffer,
  23.    EditBase.
  24. *)
  25.  
  26. (*    ACHTUNG! Dies Modul darf keine anderen GME-Module importieren! *)
  27.  
  28. FROM SYSTEM  IMPORT ADDRESS, ADR, CAST, TSIZE;
  29. FROM SysUtil0 IMPORT Byte, Cardinal;
  30. FROM SysUtil1 IMPORT SuperPoke, SuperPeek (*, Byte, Cardinal*);
  31.  
  32. FROM BIOS IMPORT Device, BConStat, BConIn, KBShiftBits, KBShifts;
  33.  
  34. FROM Convert IMPORT ConvCard;
  35. IMPORT Directory, FileNames;
  36.  
  37. FROM AESWindows IMPORT CreateWindow, WElementSet, OpenWindow;
  38. FROM AESMisc IMPORT SelectFile;
  39. FROM GEMGlobals IMPORT MouseButton, MButtonSet, FillType;
  40. FROM GrafBase IMPORT Point, Rectangle, WritingMode;
  41. FROM VDIAttributes IMPORT SetWritingMode, SetFillType, SetFillIndex,
  42.   SetLineType, SetFillPerimeter;
  43.  
  44. FROM VDIOutputs IMPORT Bar, FillRectangle;
  45.  
  46. FROM XBIOS IMPORT ConfigureCursor;
  47.  
  48. IMPORT EasyGEM0;
  49.  
  50. FROM VDIEscapes IMPORT CursorText, CursorHome, EraseToEndOfScreen,
  51.                        EraseToEndOfLine, LocateCursor, GetCursorLocation,
  52.                        ReverseVideoOn, ReverseVideoOff, DisplayCursor,
  53.                        RemoveCursor, GetCharCells;
  54.  
  55. FROM VDIInputs IMPORT GetMouseState;
  56.  
  57. FROM VDIControls IMPORT SetClipping, DisableClipping;
  58.  
  59. FROM AESGraphics IMPORT MouseForm, (*arrow, bee, flatHand,*)
  60.   GrafMouse;
  61.  
  62. FROM AESForms IMPORT FormAlert;
  63.  
  64. FROM GEMEnv IMPORT DeviceHandle, InitGem, RC, GrafHandle, ExitGem,
  65.   CurrGemHandle;
  66.  
  67. FROM AESWindows IMPORT UpdateWindow;
  68.  
  69. FROM Strings IMPORT Assign, Append, Insert, Length, Pos;
  70.  
  71. FROM GEMDOS IMPORT GetDrv, GetPath, Version;
  72.  
  73. (*
  74. IMPORT Storage;
  75. FROM Storage IMPORT Inconsistent;
  76. *)
  77. IMPORT Granule;
  78.  
  79. IMPORT FastStrings;
  80.  
  81. (*    ACHTUNG! Dies Modul darf keine anderen GME-Module importieren! *)
  82.  
  83.  
  84. (* KeyBase *)
  85.  
  86. PROCEDURE KeyReady(): BOOLEAN;
  87. BEGIN RETURN BConStat (CON);
  88. END KeyReady;
  89.  
  90. PROCEDURE KillKeyInput;
  91. VAR     Long:   LONGCARD;
  92. BEGIN WHILE BConStat (CON) DO Long := BConIn (CON); END;
  93. END KillKeyInput;
  94.  
  95.  
  96. PROCEDURE Init;
  97. CONST tabConst = eineScanTabelle {
  98.   TEsc,T1,T2,T3,T4,T5,T6,T7,T8,T9,T0,Tsz,TApo,TBackspace,TTab,Tq,Tw,Te,
  99.   Tr,Tt,Tz,Tu,Ti,To,Tp,Tue,TPlus,TRet,NoKey,Ta,Ts,Td,Tf,Tg,Th,Tj,Tk,Tl,
  100.   Toe,Tae,TNum,NoKey,TTild,Ty,Tx,Tc,Tv,Tb,Tn,Tm,TKomma,TPunkt,TMinus,NoKey,
  101.   NoKey,NoKey,TLeer,NoKey,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,NoKey,NoKey,
  102.   CHome,CUp,NoKey,NMinus,CLeft,NoKey,CRight,NPlus,NoKey,CDown,NoKey,CInsert,
  103.   TDel,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,NoKey,NoKey,TGr,CUndo,CHelp,NLeftp,
  104.   NRightp,NSlash,NAsterix,N7,N8,N9,N4,N5,N6,N1,N2,N3,N0,NPoint,NEnter,
  105.   CLeft,CRight,NoKey,NoKey,CHome,T1,T2,T3,T4,T5,T6,T7,T8,T9,T0,Tsz,TApo};
  106. BEGIN
  107.   ScanTab:= tabConst;
  108. END Init;
  109.  
  110. PROCEDURE ReadKey (VAR k: einKey; VAR s: einStatus);
  111.  
  112. VAR     Long:           LONGCARD;
  113.         L, H:           CARDINAL;
  114.         kstatus:        CARDINAL;
  115.         sc:             CARDINAL;
  116.         str:            ARRAY [0..10] OF CHAR;
  117. BEGIN
  118.   LOOP
  119.     IF BConStat (CON) THEN
  120.       Long := BConIn (CON);
  121.       (* L := SHORT (Long MOD 65536); *)
  122.       H := SHORT (Long DIV 65536);
  123.       sc := H MOD 256;
  124.       kstatus := H DIV 256;
  125.       IF ODD (kstatus) THEN
  126.         kstatus := kstatus DIV 2; INC (kstatus);
  127.       ELSE
  128.         kstatus := kstatus DIV 2;
  129.       END;
  130.       s := CAST (einStatus, kstatus);
  131.       
  132.       IF (sc >= MinScanCode) & (sc <= MaxScanCode) THEN
  133.         k := ScanTab [sc];
  134.       ELSE
  135.         k := KeyError;
  136.       END;
  137.       
  138.       EXIT;
  139.     END (* IF *);
  140.   END (* LOOP *);
  141. END ReadKey;
  142.  
  143. (* Tastatur so initialisieren, daß KBShifts mit abgefragt werden *)
  144. (* Das folgende stammt von Peter Hellinger *)
  145.  
  146. CONST   TastenKlick     = 0;    (* gesetzt = Tastaturklick ein  *)
  147.         TastenRepeat    = 1;    (* gesetzt = Wiederholung ein   *)
  148.         Glocke          = 2;    (* Ding-Dong bei Ctrl-G         *)
  149.         Kbshift         = 3;    (* Tastaturzustand              *)
  150.  
  151. (* Man sieht: Mit conterm kann man allerlei Geschichten machen.
  152.  * Andererseits, es gibt ja auch noch das Kontrollfeld...
  153.  *)
  154.  
  155. TYPE    ByteSet         = SET OF [0..7];
  156.                           (* Damit wir nachher elegant mit INCL und
  157.                            * EXCL das Bit setzten bzw. löschen können.
  158.                            *)
  159.  
  160. CONST   CConTerm =      0484HL;
  161.  
  162. VAR     ConTerm (*[0484H]*)  : ByteSet; (* Sysvar, ist nur ein Byte! *)
  163.         (*stack           : ADDRESS; (* Stackadresse für GEMDOS.Super *)*)
  164.         BitGesetzt      : BOOLEAN; (* Flag, ob Kbshift gesetzt *)
  165.  
  166. PROCEDURE TastInit;
  167. BEGIN
  168.  BitGesetzt:= FALSE;
  169.  (* Super (stack); (* Zugriff nur im Supervisor-Modus! *) *)
  170.  (* Erstmal abfragen, ob das Bit nicht schon gesetzt ist. Es könnte sich
  171.   * bereits ein anderes Programm (ACC etc.) dieser Methode bedienen, dem
  172.   * wir bei einem bedingungslosem TastReset ja den "Boden unter den
  173.   * Füßen" wegziehen würden...
  174.   *)
  175.  SuperPeek (CConTerm, ConTerm);
  176.  IF Kbshift IN ConTerm THEN
  177.   BitGesetzt:= TRUE;
  178.  ELSE
  179.   INCL (ConTerm, Kbshift); (* Bit setzen *)
  180.  END;
  181.  SuperPoke (CConTerm, ConTerm);
  182. END TastInit;
  183.  
  184. PROCEDURE TastReset;
  185. BEGIN
  186.  IF NOT BitGesetzt THEN  (* Nur Reset wenn vorher nicht gesetzt! *)
  187.   EXCL (ConTerm, Kbshift); (* Bit löschen *)
  188.  SuperPoke (CConTerm, ConTerm);
  189.  END;
  190. END TastReset;
  191.  
  192. (* ScreenBase *)
  193.  
  194. CONST   ceditor =       ">>> GME: Golem Mini Editor 1.2 <<<";
  195.  
  196. CONST
  197.   IFMaus =              TRUE;
  198.   cTrace =              FALSE;
  199.  
  200. VAR
  201.   ok:                   BOOLEAN;
  202.   CursorAn:             BOOLEAN;
  203.   CursorBlink:          BOOLEAN;
  204.   alteBlinkrate:        INTEGER;
  205.   altesAttribut:        INTEGER;
  206.  
  207. VAR
  208.   Status:               INTEGER;
  209.   MausIstSichtbar:      BOOLEAN;
  210.   oldx, oldy:           CARDINAL;
  211.   OldKnoepfe:           ButtonSet;
  212.  
  213.   topbox:               Rectangle;
  214.  
  215. PROCEDURE TopBox;
  216. BEGIN
  217.   SetFillPerimeter (ScreenHandle, FALSE);
  218.   WITH topbox DO
  219.     x := 0; y := CharHeight + 3;
  220.     w := ScreenWidth; h := CharHeight - 3;
  221.   END (* WITH *);
  222.   SetFillType (ScreenHandle, hollowFill);
  223.   FillRectangle (ScreenHandle, topbox);
  224.   
  225.   SetFillPerimeter (ScreenHandle, TRUE);
  226.   WITH topbox DO
  227.     (*x := 1; *)y := CharHeight + 4;
  228.     (*w := ScreenWidth - 2;*) h := CharHeight - 4;
  229.   END (* WITH *);
  230.   SetFillType (ScreenHandle, dottPattern);
  231.   SetFillIndex (ScreenHandle, 2);
  232.   Bar (ScreenHandle, topbox);
  233. END TopBox;
  234.  
  235. PROCEDURE GetVersion (VAR version: ARRAY OF CHAR);
  236. BEGIN Assign (ceditor, version, ok);
  237. END GetVersion;
  238.  
  239. (* ******************** Cursorsteuerung ******************** *)
  240.  
  241. PROCEDURE WrapOff;
  242. VAR
  243.   p:                    ARRAY [0..1] OF CHAR;
  244.  
  245. BEGIN
  246.   p [0] := escape; p [1] := 'w';
  247.   CursorText (ScreenHandle, p);
  248. END WrapOff;
  249.  
  250.  
  251. PROCEDURE WrapOn;
  252. VAR     p:      ARRAY [0..1] OF CHAR;
  253. BEGIN
  254.   p [0] := escape; p [1] := 'v';
  255.   CursorText (ScreenHandle, p);
  256. END WrapOn;
  257.  
  258.  
  259. PROCEDURE WriteChar (c: CHAR);
  260. BEGIN
  261.   MausAus;
  262.   CursorText (ScreenHandle, c);
  263. END WriteChar;
  264.  
  265. PROCEDURE WriteLine (REF s: ARRAY OF CHAR);
  266. BEGIN
  267.   MausAus;
  268.   CursorText (ScreenHandle, s);
  269. END WriteLine;
  270.  
  271. PROCEDURE WriteConst (REF s: ARRAY OF CHAR);
  272. BEGIN WriteLine (s); END WriteConst;
  273.  
  274. PROCEDURE Trace (REF s: ARRAY OF CHAR);
  275. BEGIN
  276.   IF cTrace THEN
  277.     WriteLn; WriteLine (s);
  278.   END;
  279. END Trace;
  280.  
  281. PROCEDURE WhereXY (VAR x, y: CARDINAL);
  282. BEGIN
  283.   GetCursorLocation (ScreenHandle, x, y);
  284. END WhereXY;
  285.  
  286. PROCEDURE GotoXY (x0, y0: CARDINAL);
  287. VAR (*$Reg*)x,(*$Reg*)y: CARDINAL;
  288. BEGIN
  289.   x:= x0;
  290.   y:= y0;
  291.   (* Boeser GEM-Fehler: Absturz bei illegalen x/y-Werten: *)
  292.   INC (x);
  293.   IF x > CharsInLine THEN x := CharsInLine; END;
  294.   IF y > LinesOnScreen THEN y := LinesOnScreen; END;
  295.   INC (y, 3); (* LinesOnScreen wurde in diesem Modul um 3 reduziert!!! *)
  296.   LocateCursor (ScreenHandle, x, y);
  297.   IF ~CursorAn THEN
  298.     (*CursorEin;*)
  299.     
  300.     WriteChar (escape); WriteChar ("f");
  301.     (*CursorAn := TRUE;
  302.     *)
  303.   END (* IF *);
  304. END GotoXY;
  305.  
  306. PROCEDURE CursorEin;
  307. VAR     x, y:   CARDINAL;
  308.         dummy:  INTEGER;
  309. BEGIN
  310.   IF ~CursorAn THEN
  311.     MausAus;
  312.     IF ~CursorBlink THEN
  313.       dummy := ConfigureCursor (2, alteBlinkrate);
  314.       CursorBlink := TRUE;
  315.     END;
  316.     WriteChar (escape); WriteChar ("e");
  317.     CursorAn := TRUE;
  318.   END;
  319. END CursorEin;
  320.  
  321. PROCEDURE CursorStumm;
  322. VAR     d:      INTEGER;
  323.         dummy:  INTEGER;
  324. BEGIN
  325.   IF CursorBlink THEN
  326.     d := ConfigureCursor (0, -1);
  327.     d := ConfigureCursor (3, -1); CursorBlink := FALSE;
  328.     d := ConfigureCursor (1, -1); CursorAn := TRUE;
  329.   END;
  330. END CursorStumm;
  331.  
  332. PROCEDURE CursorSchnell;
  333. VAR     d:      INTEGER;
  334.         x, y:   CARDINAL;
  335.         dummy:  INTEGER;
  336. BEGIN
  337.   IF ~CursorAn THEN CursorEin; END;
  338.   d := ConfigureCursor (2, 10); CursorBlink := TRUE;
  339. END CursorSchnell;
  340.  
  341. PROCEDURE CursorAus;
  342. VAR     d:      INTEGER;
  343.         dummy:  INTEGER;
  344. BEGIN
  345.   IF CursorAn THEN
  346.     WriteChar (escape); WriteChar ("f");
  347.     CursorAn := FALSE;
  348.   END;
  349. END CursorAus;
  350.  
  351. PROCEDURE LoescheZeile;
  352. BEGIN
  353.   MausAus; EraseToEndOfLine (ScreenHandle);
  354. END LoescheZeile;
  355.  
  356. PROCEDURE LoescheBild;
  357. BEGIN
  358.   MausAus;
  359.   GotoXY (0, 0);
  360.   EraseToEndOfScreen (ScreenHandle);
  361. END LoescheBild;
  362.  
  363. PROCEDURE LoescheEndeBild;
  364. BEGIN
  365.   MausAus; EraseToEndOfScreen (ScreenHandle);
  366. END LoescheEndeBild;
  367.  
  368. PROCEDURE HighLight;
  369. BEGIN
  370.   ReverseVideoOn (ScreenHandle);
  371. END HighLight;
  372.  
  373. PROCEDURE Normal;
  374. BEGIN
  375.   ReverseVideoOff (ScreenHandle);
  376. END Normal;
  377.  
  378. PROCEDURE WriteLn;
  379. BEGIN
  380.   WriteChar (cr); WriteChar (lf);
  381. END WriteLn;
  382.  
  383. PROCEDURE InsertLn;
  384. BEGIN
  385.   WriteChar (escape); WriteChar (lineins);
  386. END InsertLn;
  387.  
  388. PROCEDURE DeleteLn;
  389. BEGIN
  390.   WriteChar (escape); WriteChar (linedel);
  391. END DeleteLn;
  392.  
  393. (* ************************ Maussteuerung ******************* *)
  394.  
  395. PROCEDURE MausPos (VAR x, y: CARDINAL; VAR bewegt: BOOLEAN;
  396.                    VAR Knoepfe: ButtonSet);
  397. VAR     iStatus, count, count2: INTEGER;
  398.         position:               Point;
  399.         buttons:                MButtonSet;
  400. BEGIN
  401.   IF (x # oldx) OR (y # oldy) THEN
  402.     MausEin; (*DisplayCursor (ScreenHandle, x, y);*)
  403.   END;
  404.   (* GetMouseState (ScreenHandle, iStatus, x, y); *)
  405.   GetMouseState (ScreenHandle, position, buttons);
  406.   (*<TDI Knoepfe := ButtonSet (iStatus); TDI>*)
  407.   (*<MM2 *) Knoepfe := CAST (ButtonSet, buttons); (* MM2> *)
  408.  
  409.   x := position.x; y := position.y;
  410.   IF (x # oldx) OR (y # oldy) OR (Knoepfe # OldKnoepfe) THEN
  411.     bewegt := TRUE; oldx := x; oldy := y; OldKnoepfe := Knoepfe;
  412.   ELSE bewegt := FALSE;
  413.   END (* IF *);
  414.   
  415.   IF bewegt THEN MausEin; END;
  416. END MausPos;
  417.  
  418. VAR     StartX, StartY, OldX, OldY:     INTEGER;
  419.  
  420. PROCEDURE Box (sx, sy, ex, ey: INTEGER);
  421. (* VAR     pxy:    PxyArrayType; *)
  422. VAR     rect:   Rectangle;
  423. BEGIN
  424.   WITH rect DO
  425.     x := sx; y := sy; w := ex - sx; h := ey - sy;
  426.   END (* WITH *);
  427.   MausAus;
  428.   Bar (ScreenHandle, rect);
  429.   MausEin;
  430. END Box;
  431.  
  432. PROCEDURE StartBox (x, y: INTEGER);
  433. VAR m:          INTEGER;
  434.     (* p:          PxyArrayType; *)
  435.     rect:       Rectangle;
  436. BEGIN
  437.   SetWritingMode (ScreenHandle, reverseWrt);
  438.  
  439.   (* Warum geht das nicht: ??? *)
  440.   SetFillType (ScreenHandle, hollowFill);
  441.   DisableClipping (ScreenHandle);
  442.   StartX := x; StartY := y;
  443.   OldX := x + 1; OldY := y + 1;
  444.   Box (StartX, StartY, OldX, OldY);
  445. END StartBox;
  446.  
  447. PROCEDURE GummiBox (x, y: INTEGER);
  448. BEGIN
  449.   IF (x # OldX) OR (y # OldY) THEN
  450.     Box (StartX, StartY, OldX, OldY);
  451.     Box (StartX, StartY, x, y);
  452.     OldX := x; OldY := y;
  453.   END (* IF *);
  454. END GummiBox;
  455.  
  456. PROCEDURE LoeschBox;
  457. BEGIN
  458.   Box (StartX, StartY, OldX, OldY);
  459. END LoeschBox;
  460.  
  461. PROCEDURE MausDoppel (VAR x, y: CARDINAL; VAR bewegt: BOOLEAN;
  462.                       VAR Knoepfe: ButtonSet);
  463. VAR     count:                          CARDINAL;
  464.         oldbutton:                      ButtonSet;
  465. BEGIN
  466.   MausPos (x, y, bewegt, Knoepfe); (* Need actual x, y *)
  467.   StartBox (x, y);
  468.   count := 0; (* Entprellphase *)
  469.   REPEAT (* Mausknopf loslassen bzw. GEM-Entprellung *)
  470.     MausPos (x, y, bewegt, Knoepfe);
  471.     INC (count);
  472.     IF Knoepfe # ButtonSet {} THEN
  473.       GummiBox (x, y); count := 0;
  474.     END (* IF Knopf noch nicht losgelassen *);
  475.     (* Knopf mindestens 30 Takte offen *)
  476.   UNTIL (Knoepfe = ButtonSet {}) & (count > 30);
  477.   LoeschBox;
  478.   count := 0;
  479.   REPEAT (* zweiten Klick erkennen oder RETURN nach 300 Takten *)
  480.     MausPos (x, y, bewegt, Knoepfe);
  481.     INC(count);
  482.   UNTIL (Knoepfe # ButtonSet {}) OR (count > 300);
  483. END MausDoppel;
  484.  
  485. VAR     MausForm:       MouseForm;
  486.  
  487. PROCEDURE MausEin;
  488. BEGIN
  489.   CursorStumm;
  490.   IF ~MausIstSichtbar THEN
  491.     EasyGEM0.ShowMouse;
  492.     MausIstSichtbar := TRUE;
  493.   END;
  494.   IF MausForm # arrow THEN
  495.     MausForm := arrow;
  496.     GrafMouse (MausForm, NIL);
  497.   END;
  498. END MausEin;
  499.  
  500. PROCEDURE MausBusy;
  501. BEGIN
  502.   CursorStumm;
  503.   IF ~MausIstSichtbar THEN
  504.     EasyGEM0.ShowMouse;
  505.     MausIstSichtbar := TRUE;
  506.   END;
  507.   IF MausForm # bee THEN
  508.     MausForm := bee;
  509.     GrafMouse (MausForm, NIL);
  510.   END;
  511. END MausBusy;
  512.  
  513. PROCEDURE MausAus;
  514. BEGIN
  515.   IF MausIstSichtbar THEN
  516.     EasyGEM0.HideMouse;
  517.     MausIstSichtbar := FALSE;
  518.   END;
  519. END MausAus;
  520.  
  521. PROCEDURE Nachricht (REF m: ARRAY OF CHAR);
  522. VAR     alert:  ARRAY [0..199] OF CHAR;
  523.         i:      CARDINAL;
  524.         dummy:  LONGCARD;
  525. BEGIN
  526.   IF IFMaus THEN
  527.     CursorAus;
  528.     Assign (m, alert, ok);
  529.     EasyGEM0.WrapAlert (alert, 0);
  530.     Insert ('[3][', 0, alert, ok);
  531.     Append ('][ OK ]', alert, ok);
  532.     MausEin;
  533.     FormAlert (1, alert, i);
  534.     CursorEin;
  535.   END (* IF Maus *);
  536. END Nachricht;
  537.  
  538. PROCEDURE FrageJaNein (default: CARDINAL; m: ARRAY OF CHAR): BOOLEAN;
  539. TYPE    CharSet = SET OF CHAR;
  540. VAR     alert:  ARRAY [0..199] OF CHAR;
  541.         dummy:  CHAR;
  542.         ok:     BOOLEAN;
  543.         retBut: CARDINAL;
  544. BEGIN
  545.   IF IFMaus THEN
  546.     CursorAus;
  547.     Assign (m, alert, ok);
  548.     EasyGEM0.WrapAlert (alert, 0);
  549.     Insert ('[1][', 0, alert, ok);
  550.     Append ('][ JA | NEIN ]', alert, ok);
  551.     MausEin;
  552.     FormAlert (default, alert, retBut);
  553.     CursorEin;
  554.     RETURN retBut = 1;
  555.   END (* IF Maus *);
  556. END FrageJaNein;
  557.  
  558. PROCEDURE Auswahl (VAR default: CARDINAL; m: ARRAY OF CHAR);
  559. TYPE    CharSet = SET OF CHAR;
  560. VAR     alert:  ARRAY [0..199] OF CHAR;
  561.         dummy:  CHAR;
  562.         ok:     BOOLEAN;
  563.         retBut: CARDINAL;
  564. BEGIN
  565.   IF IFMaus THEN
  566.     CursorAus;
  567.     Assign (m, alert, ok);
  568.     EasyGEM0.WrapAlert (alert, 0);
  569.     Insert ('[1][', 0, alert, ok);
  570.     Append ('][ JA |NEIN|ABBRUCH]', alert, ok);
  571.     MausEin;
  572.     FormAlert (default, alert, retBut);
  573.     CursorEin;
  574.     default := retBut;
  575.   END (* IF Maus *);
  576. END Auswahl;
  577.  
  578. PROCEDURE InitAES;
  579. VAR     str:            ARRAY [0..99] OF CHAR;
  580.         i:              CARDINAL;
  581.         wc, hc, sh: CARDINAL;
  582.         ok:             BOOLEAN;
  583. VAR     rows, columns:  CARDINAL;
  584.         rectangle:      Rectangle;
  585.   
  586. BEGIN
  587.   InitGem (RC, ScreenHandle, ok);
  588.   ApId := CurrGemHandle();
  589.   
  590.   (* Get AES VDI handle *)
  591.   GrafHandle (CharWidth, CharHeight, wc, hc, sh);
  592.   
  593.   rectangle := EasyGEM0.DeskSize();
  594.   INC (rectangle.h);
  595.   ScreenWidth := rectangle.w (*639*);
  596.   ScreenHeight := rectangle.h (*399*);
  597.   
  598.   (* "Window" über ganze Screen öffnen, damit wir Redraw-Msgs bekommen *)
  599.   CreateWindow (WElementSet{}, rectangle, WindowHandle);
  600.   OpenWindow (WindowHandle, rectangle);
  601.   
  602.   GrafMouse (arrow, NIL);
  603.   GetCharCells (ScreenHandle, LinesOnScreen, CharsInLine);
  604.   DEC (LinesOnScreen, 3);
  605. END InitAES;
  606.  
  607. PROCEDURE ClearAES;
  608. BEGIN
  609.   UpdateWindow (FALSE);
  610.   ExitGem (ApId);
  611. END ClearAES;
  612.  
  613. (* EditBuffer *)
  614.  
  615. PROCEDURE InitBuffer;
  616. BEGIN
  617.   UndoPuffer := NIL; ClipBoard := NIL; HilfsPuffer := NIL;
  618.   ConfigPuffer := NIL; EditPuffer := NIL; AlternEdit := NIL;
  619.   FehlerPuffer := NIL; MailPuffer := NIL; GolemPuffer := NIL;
  620.   SendePuffer := NIL; Tausch := NIL; PSCPuffer := NIL;
  621.   LoadPuffer := NIL; DruckerBatch := NIL; TextVergleichP := NIL;
  622.   WaehlPuffer := NIL; DruckPuff := NIL; StartPuffer := NIL;
  623.   Puffer1 := NIL; Puffer2 := NIL; Puffer3 := NIL; Puffer4 := NIL;
  624. END InitBuffer;
  625.  
  626. (* InitBuffer nicht im Initialisierungsteil aufrufen - Problem mit
  627.    Initialisierungsreihenfolge! Wird in EditBase gerufen! *)
  628.  
  629. (************************** EditBase *********************************)
  630.  
  631. (* Fehlernummer: 100 *)
  632.  
  633.  
  634. (* The Little Golem Editor. Begonnen 13. 06. 86
  635.    (C) 1986, 1988 by Johannes Leckebusch, Wolfgang Huber, Walter Sonnenberg.
  636.    Version: Siehe ceditor
  637.    Stand: 13. 02. 89
  638. *)
  639.  
  640. VAR checkInconsistency: BOOLEAN;
  641.  
  642. PROCEDURE ALLOCATE (VAR p: ADDRESS; l: LONGCARD);
  643.   BEGIN
  644.     (*
  645.     IF checkInconsistency & Inconsistent() THEN
  646.       Nachricht ('Error before ALLOCATE'); HALT;
  647.     END;
  648.     *)
  649.     (* Storage.ALLOCATE (p, l); *)
  650.     Granule.ALLOCATE (p, l);
  651.     (*
  652.     IF checkInconsistency & Inconsistent() THEN
  653.       Nachricht ('Error after ALLOCATE'); HALT;
  654.     END;
  655.     *)
  656.   END ALLOCATE;
  657.   
  658. PROCEDURE DEALLOCATE (VAR p: ADDRESS; l: LONGCARD);
  659.   BEGIN
  660.     (*
  661.     IF checkInconsistency & Inconsistent() THEN
  662.       Nachricht ('Error before DEALLOCATE'); HALT;
  663.     END;
  664.     *)
  665.     (* Storage.DEALLOCATE (p, l); *)
  666.     Granule.DEALLOCATE (p, l);
  667.     (*
  668.     IF checkInconsistency & Inconsistent() THEN
  669.       Nachricht ('Error after DEALLOCATE'); HALT;
  670.     END;
  671.     *)
  672.   END DEALLOCATE;
  673.  
  674. VAR     dummyC:         CARDINAL;
  675.  
  676. PROCEDURE DeAllocLine (VAR p: einLinePointer);
  677. VAR     groesse:        CARDINAL;
  678. BEGIN
  679.   groesse := p^.laenge;
  680.   IF groesse > 0 THEN
  681.     groesse := ((groesse - 1) DIV cAllocate + 1) * cAllocate;
  682.     DEALLOCATE (p^.ZeilPointer, VAL (LONGCARD, groesse));
  683.   END (* IF *);
  684.   DISPOSE (p);
  685. END DeAllocLine;
  686.  
  687. PROCEDURE AllocLine (VAR p: einLinePointer; groesse: CARDINAL);
  688. BEGIN
  689.   NEW (p);
  690.   IF p # NIL THEN
  691.     WITH p^ DO
  692.       terminator[0] := nul;
  693.       IF groesse > 0 THEN (* Aenderung 18. 11. 87 *)
  694.         laenge := (groesse DIV cAllocate + 1) * cAllocate;
  695.         ALLOCATE (ZeilPointer, VAL (LONGCARD, laenge));
  696.       ELSE
  697.         ZeilPointer := ADR (terminator);
  698.         laenge := 0;
  699.       END (* IF groesse *);
  700.       IF ZeilPointer = NIL THEN
  701.         DISPOSE (p);
  702.       ELSE
  703.         vorige := NIL; naechste := NIL;
  704.       END (* IF ZeilPointer *);
  705.     END (* WITH *);
  706.   END (* IF *);
  707. END AllocLine;
  708.  
  709. PROCEDURE GetLine (p: einLinePointer; VAR s: ARRAY OF CHAR);
  710.   (* Kopiere Zeileninhalt in String *)
  711. VAR     index, l:       CARDINAL;
  712. BEGIN
  713.   (*index := 0;*)
  714.   IF p # NIL THEN
  715.     WITH p^ DO
  716.       FastStrings.Assign (ZeilPointer^, s);
  717.     END (* WITH p *);
  718.   ELSE s [0] := nul;
  719.   END (* IF p # NIL *);
  720. END GetLine;
  721.  
  722. PROCEDURE PutLine (VAR p: einLinePointer;
  723.                    REF s: ARRAY OF CHAR);
  724.   (* Kopiere String in eine Zeile (Allocate optimiert) *)
  725. VAR     index, l:       CARDINAL;
  726.         oldstring:      einStringPointer;
  727.         dummy:          CHAR;
  728. BEGIN
  729.   IF p = NIL THEN RETURN END;
  730.   l := FastStrings.Length (s); (* Compile error 89 bei FastStrings!!! *)
  731.   IF l > 0 THEN (* Aenderung 18. 11. 87 *)
  732.     index := (l DIV cAllocate + 1) * cAllocate;
  733.     (* Laenge plus 1, um sicherzustellen, daß String nullterminated *)
  734.     ELSE index := 0;
  735.   END (* IF *);
  736.   IF index # p^.laenge THEN
  737.     oldstring := p^.ZeilPointer;
  738.     IF index > 0 THEN
  739.       ALLOCATE (p^.ZeilPointer, LONG (index));
  740.       (* Compilerfehler 89        ^^^ *)
  741.     ELSE
  742.       p^.ZeilPointer := ADR (p^.terminator);
  743.     END (* IF *);
  744.     IF p^.ZeilPointer = NIL THEN
  745.       p^.ZeilPointer := oldstring; RETURN;
  746.     END (* IF *);
  747.     IF p^.laenge > 0 THEN
  748.       DEALLOCATE (oldstring, LONG (p^.laenge));
  749.     END;
  750.     p^.laenge := index;
  751.   END (* IF neue alloziieren *);
  752.   WITH p^ DO
  753.     FastStrings.Assign (s, ZeilPointer^);
  754.   END (* WITH p^ *);
  755. END PutLine;
  756.  
  757. PROCEDURE DeallocPuffer (VAR Puff: einPufferPointer);
  758. VAR       Help:                 einLinePointer;
  759.           MerkInd:              MerkIndex;
  760.           MerkPunkt, hM:        einMerkPointer;
  761. BEGIN
  762.   WITH Puff^ DO
  763.     Help := Puffer^.naechste;
  764.     WHILE (Help # NIL) DO
  765.       IF Help^.vorige^.laenge > 0 THEN (* Aenderung 18. 11. 87! *)
  766.         DEALLOCATE (Help^.vorige^.ZeilPointer, LONG (Help^.vorige^.laenge));
  767.       END (* IF *);
  768.       DISPOSE (Help^.vorige);
  769.       IF Help^.naechste = NIL THEN (* Aenderung 18. 11. 87! *)
  770.         IF Help^.laenge > 0 THEN
  771.           DEALLOCATE (Help^.ZeilPointer, LONG (Help^.laenge));
  772.         END (* IF *);
  773.         DISPOSE (Help);
  774.       ELSE Help := Help^.naechste;
  775.       END (* IF *);
  776.     END (* WHILE *);
  777.     
  778.     FOR MerkInd := LetztePosition TO ErsteZeile BY -1 DO
  779.       (* rückwärts, weil ErsteZeile und LaufendeZeile bei aktueller
  780.          Indexliste Duplikatpointer enthalten können, die mitten in
  781.          MerkPunktlisten liegen *)
  782.          
  783.       WITH MerkPunkte [MerkInd] DO
  784.         IF (merkinfo # NIL) & (merkinfo^.laenge > 0) THEN
  785.           IF merkinfo^.ZeilPointer # NIL THEN
  786.             DEALLOCATE (merkinfo^.ZeilPointer, LONG (merkinfo^.laenge));
  787.           END;
  788.         END (* IF *);
  789.         IF merkinfo # NIL THEN DISPOSE (merkinfo); END;
  790.         IF MerkInd > LaufendeZeile THEN
  791.           MerkPunkt := nextMerk;
  792.           WHILE MerkPunkt # NIL DO
  793.             hM := MerkPunkt; MerkPunkt := MerkPunkt^.nextMerk;
  794.             DISPOSE (hM);
  795.           END (* WHILE *);
  796.         END (* IF MerkInd > LaufendeZeile *);
  797.       END (* WITH *);
  798.     END (* FOR *);
  799.   END (* WITH *);
  800. END DeallocPuffer;
  801.  
  802. PROCEDURE Loeschen (VAR Puff: einPufferPointer);
  803. BEGIN
  804.   MausBusy;
  805.   DeallocPuffer (Puff);
  806.   PuffInit (Puff);
  807. END Loeschen;
  808.  
  809. PROCEDURE PufferLeer (Puff: einPufferPointer): BOOLEAN;
  810. BEGIN
  811.   IF (Puff = NIL) THEN
  812.     Nachricht ('Interner Fehler|PufferLeer NIL!101');
  813.     RETURN FALSE;
  814.   END;
  815.   RETURN (Puff^.Puffer^.naechste^.naechste = NIL) &
  816.          (Puff^.Puffer^.naechste^.ZeilPointer^[0] = nul);
  817. END PufferLeer;
  818.  
  819. PROCEDURE FindeLeerpuffer (Puff: einPufferPointer): einPufferPointer;
  820. VAR     hp:     einPufferPointer;
  821. BEGIN
  822.   IF (Puff = NIL) THEN
  823.     Nachricht ('Interner Fehler|FindeLeerpuffer NIL.102');
  824.     RETURN NIL;
  825.   END;
  826.   hp := Puff;
  827.   WHILE (~PufferLeer (hp)) & (*(hp = MailPuffer) & (hp = HilfsPuffer) &*)
  828.         (hp^.NaechsterPuffer # Puff) DO
  829.     hp := hp^.NaechsterPuffer;
  830.   END (* WHILE *);
  831.   IF ~PufferLeer (hp) THEN
  832.      hp := InsertPuffer (Puff);
  833.   END (* IF *);
  834.   RETURN hp;
  835. END FindeLeerpuffer;
  836.  
  837. PROCEDURE InsertPuffer (Puff: einPufferPointer): einPufferPointer;
  838. VAR     h:      einPufferPointer;
  839. BEGIN
  840.   IF (Puff = NIL) THEN
  841.     Nachricht ('Interner Fehler|InsertPuffer NIL.103');
  842.     RETURN NIL;
  843.   END;
  844.   h := Puff^.NaechsterPuffer;
  845.   NEW (Puff^.NaechsterPuffer);
  846.   IF Puff^.NaechsterPuffer = NIL THEN
  847.     Puff^.NaechsterPuffer := h;
  848.     Nachricht ('Kein Platz für weitere |Puffer!104');
  849.     RETURN Puff;
  850.   ELSE
  851.     PuffInit (Puff^.NaechsterPuffer);
  852.     IF Puff^.NaechsterPuffer # NIL THEN
  853.       Puff^.NaechsterPuffer^.NaechsterPuffer := h;
  854.       RETURN Puff^.NaechsterPuffer;
  855.     ELSE Nachricht ('Kein Platz für |Pufferinitialisierung!105');
  856.       RETURN Puff;
  857.     END (* IF *);
  858.   END (* IF *);
  859. END InsertPuffer;
  860.  
  861. PROCEDURE DeletePuffer (VAR Puff: einPufferPointer);
  862. VAR     h, v:    einPufferPointer;
  863. BEGIN
  864.   h := Puff^.NaechsterPuffer;
  865.   IF (h # Puff) & (Moden {Editiert} * Puff^.Modus = Moden {}) THEN
  866.     v := h;
  867.     WHILE v^.NaechsterPuffer # Puff DO
  868.       v := v^.NaechsterPuffer;
  869.     END (* WHILE --> v ist der vorige Puffer *);
  870.     IF Puff = UndoPuffer   THEN UndoPuffer   := h; END;
  871.     IF Puff = ClipBoard    THEN ClipBoard    := h; END;
  872.     IF Puff = HilfsPuffer  THEN HilfsPuffer  := h; END;
  873.     IF Puff = ConfigPuffer THEN ConfigPuffer := h; END;
  874.     IF Puff = EditPuffer   THEN EditPuffer   := h; END;
  875.     IF Puff = AlternEdit   THEN AlternEdit   := h; END;
  876.     IF Puff = FehlerPuffer THEN FehlerPuffer := h; END;
  877.     IF Puff = MailPuffer   THEN MailPuffer   := h; END;
  878.     IF Puff = GolemPuffer  THEN GolemPuffer  := h; END;
  879.     IF Puff = SendePuffer  THEN SendePuffer  := h; END;
  880.     IF Puff = PSCPuffer    THEN PSCPuffer    := h; END;
  881.     IF Puff = Tausch       THEN Tausch       := h; END;
  882.     DeallocPuffer (Puff);
  883.     v^.NaechsterPuffer := h; Puff := h;
  884.     (* Nachricht ('Puffer entfernt'); *)
  885.   ELSE (* Nachricht ('Puffer kann nicht|gelöscht werden.107'); *)
  886.   END (* IF nicht letzter Puffer *)
  887. END DeletePuffer;
  888.  
  889. PROCEDURE PutConstLine (VAR p: einLinePointer; REF s: ARRAY OF CHAR);
  890. BEGIN
  891.   PutLine (p, s);
  892. END PutConstLine;
  893.  
  894. PROCEDURE PuffInit (VAR Puff: einPufferPointer);
  895. VAR     merkindex:      MerkIndex;
  896. BEGIN
  897. (*
  898.   IF Inconsistent() THEN Nachricht ('Error before PuffInit'); HALT; END;
  899.   checkInconsistency:= FALSE;
  900. *)
  901.   IF Puff = NIL THEN RETURN END;
  902.   WITH Puff^ DO
  903.     AllocLine (Puffer, 0);
  904.     IF Puffer = NIL THEN
  905.       Puff := NIL;
  906. (*
  907.       checkInconsistency:= TRUE;
  908.       IF Inconsistent() THEN Nachricht ('Error after PuffInit'); HALT; END;
  909. *)
  910.       RETURN;
  911.     END;
  912.     WITH Puffer^ DO
  913.       AllocLine (naechste, 0);
  914.       IF naechste = NIL THEN Puff := NIL; checkInconsistency:= TRUE;
  915. (*
  916.         IF Inconsistent() THEN Nachricht ('Error after PuffInit'); HALT; END;
  917. *)
  918.         RETURN;
  919.       END;
  920.       naechste^.vorige := Puffer;
  921.     END (* WITH *);
  922.     
  923.     FOR merkindex :=  ErsteZeile TO LetztePosition DO
  924.       WITH Puff^.MerkPunkte [merkindex] DO
  925.         zeilpos := 1; charpos := 0;
  926.         merkline := Puffer^.naechste;
  927.         nextMerk := NIL;
  928.         AllocLine (merkinfo, 0);
  929.         IF merkinfo = NIL THEN Puff := NIL; checkInconsistency:= TRUE;
  930. (*
  931.           IF Inconsistent() THEN Nachricht ('Error after PuffInit'); HALT; END;
  932. *)
  933.           RETURN;
  934.         END;
  935.         CASE merkindex OF
  936.           ErsteZeile:           PutConstLine (merkinfo, 'ErsteZeile');|
  937.           LaufendeZeile:        PutConstLine (merkinfo, 'LaufendeZeile');|
  938.           MerkPunkt1:           PutConstLine (merkinfo, 'MerkPunkt1');|
  939.           MerkPunkt2:           PutConstLine (merkinfo, 'MerkPunkt2');|
  940.           CompilerInfo:         PutConstLine (merkinfo, 'Kein_Fehler');|
  941.           BlockMarke1:          PutConstLine (merkinfo, 'BlockMarke1');|
  942.           BlockMarke2:          PutConstLine (merkinfo, 'BlockMarke2');|
  943.           PufferVergleich:      PutConstLine (merkinfo, 'PufferVergleich');|
  944.           IndexListe:           PutConstLine (merkinfo, 'IndexListe');|
  945.           DruckerSteuer:        PutConstLine (merkinfo, 'DruckerSteuer');|
  946.           Protokoll:            PutConstLine (merkinfo, 'Protokoll');|
  947.           Textbausteine:        PutConstLine (merkinfo, 'Textbausteine');|
  948.           Datei:                PutConstLine (merkinfo, 'Datei');|
  949.           M13:                  PutConstLine (merkinfo, 'M13');|
  950.           M14:                  PutConstLine (merkinfo, 'M14');|
  951.           LetztePosition:       PutConstLine (merkinfo, 'LetztePosition');
  952.         END (* CASE *);
  953.       END (* WITH MerkPunkte *);
  954.     END (* FOR merkindex *);
  955.     
  956.     WITH Puff^.MerkPunkte [ErsteZeile] DO
  957.       zeilpos := 0;
  958.     END (* WITH *);
  959.     ZeilenAnzahl := 1; (*VirtualX := 0;*)
  960.     
  961.     MagicRevision :=    cRevision;
  962.     Modus :=            ConfigPuffer^.Modus;
  963.     EXCL (Modus, Editiert);
  964.     Pfad := '';         Name := '';
  965.     TabWeite :=         ConfigPuffer^.TabWeite;
  966.     Max :=              ConfigPuffer^.Max;
  967.     SchreibZaehler :=   ConfigPuffer^.SchreibZaehler;
  968.   END (* WITH *);
  969.   checkInconsistency:= TRUE;
  970. (*
  971.   IF Inconsistent() THEN Nachricht ('Error after PuffInit'); HALT; END;
  972. *)
  973. END PuffInit;
  974.  
  975. (**************************** ENDE EditBase *********************)
  976.  
  977. (****************** Von Editdirectory ********************)
  978.  
  979. CONST TOS14   = 1500H;
  980.  
  981. VAR   version : CARDINAL;
  982.  
  983. PROCEDURE DeleteTail (VAR s: ARRAY OF CHAR);
  984. VAR     i:      CARDINAL;
  985.         dummy: ARRAY [0..12] OF CHAR;
  986. BEGIN
  987.   (*
  988.   i := Length (s);
  989.   WHILE (i > 0) & (s [i - 1] # '\') DO
  990.     DEC (i);
  991.     s [i] := CHR (0);
  992.   END (* WHILE *);
  993.   *)
  994.   FileNames.SplitPath (s, s, dummy);
  995. END DeleteTail;
  996.  
  997. PROCEDURE GetPfad (VAR pf: ARRAY OF CHAR);
  998. VAR   Drive:          CARDINAL;
  999.       p:              ARRAY [0..126] OF CHAR;
  1000.       suff:           ARRAY [0..5] OF CHAR;
  1001.       ind, i:         CARDINAL;
  1002. (*
  1003.   Holt akt. Pfad nach 'pf' und fügt '*.*' an wenn 'pf' vorher nicht leer,
  1004.   wird der Suffix für die Maske übernommen
  1005. *)
  1006. BEGIN
  1007.   IF (pf [0] = nul) OR (pf [0] = '*') THEN     (* 28. 11. 87 Le *)
  1008.     (*
  1009.     ind := Length (pf);
  1010.     IF ind > 0 THEN
  1011.       DEC (ind);
  1012.       WHILE (ind > 0) & (pf [ind] # '.') DO DEC (ind); END;
  1013.       IF ind > 0 THEN
  1014.         i := ind;
  1015.         WHILE (pf [ind] # nul) DO
  1016.           suff [ind - i] := pf [ind]; INC (ind);
  1017.         END (* WHILE *);
  1018.         suff [ind - i] := nul;
  1019.       END (* IF *);
  1020.     ELSE
  1021.       suff [0] := nul;
  1022.     END (* IF *);
  1023.     GetDrv (Drive);
  1024.     p [0] := CHR (0);
  1025.     pf [0] := CHR (ORD ('A') + Drive);
  1026.     pf [1] := ':'; pf [2] := CHR (0);
  1027.     GetPath (p, Drive + 1);
  1028.     Append (p, pf, ok);
  1029.     Append ('\*', pf, ok);
  1030.     IF suff [0] # nul THEN Append (suff, pf, ok)
  1031.     ELSE Append ('.*', pf, ok);
  1032.     END (* IF kein alter Suffix *);
  1033.     *)
  1034.     (* !TT 12.12.90 - neue Version *)
  1035.     FileNames.SplitName (pf, p, suff);
  1036.     IF suff[0] = '' THEN suff:= '*' END;
  1037.     FastStrings.Insert ('*.', 0, suff);
  1038.     Directory.GetDefaultPath (p);
  1039.     FileNames.ConcatPath (p, suff, pf);
  1040.   END (* IF pf leer *);
  1041. END GetPfad;
  1042.  
  1043. PROCEDURE GetDirectory (VAR Pfad, FileName: ARRAY OF CHAR;
  1044.                         Meldung: ARRAY OF CHAR;
  1045.                         VAR Butt: INTEGER; GEM: BOOLEAN);
  1046. VAR     i:      CARDINAL;
  1047.         m:      ARRAY [0..30] OF CHAR;
  1048.         ok:     BOOLEAN;
  1049. BEGIN
  1050.   IF ~GEM THEN MausEin; END;
  1051.   GetPfad (Pfad);
  1052.   (*
  1053.    IF (version >= TOS14) THEN
  1054.     Assign (Meldung, m);
  1055.     AESAddrIn[0] := ADR (Pfad);
  1056.     AESAddrIn[1] := ADR (FileName);
  1057.     AESAddrIn[2] := ADR (m);
  1058.     AESCallResult := GemCall (91,0,2,3,0);
  1059.     Butt:= AESIntOut[1];
  1060.    ELSE (* TOS-Version kann das nicht! Normalen Selector verwenden! *)
  1061.    *)
  1062.     GotoXY (0, 0); LoescheZeile; HighLight; WriteLine (Meldung); Normal;
  1063.     MausEin;
  1064.     SelectFile (Pfad, FileName, ok);
  1065.   (*END;*)
  1066.   IF ok THEN Butt := 1 ELSE Butt := 0; END;
  1067.   IF Butt # 1 THEN (* Abbruch *)
  1068.     Assign ('', FileName, ok);
  1069.   END (* IF Butt *);
  1070.   IF ~GEM THEN
  1071.     MausAus;
  1072.     LoescheBild;
  1073.   END (* IF NOT GEM *);
  1074. END GetDirectory;
  1075.  
  1076. (*
  1077. BEGIN
  1078.  Version (version);
  1079. END EditDirectory.
  1080. *)
  1081.  
  1082. BEGIN (* GMEBASE Initialisierung *)
  1083.  
  1084.   PuffRecSize := TSIZE (einPufferDeskriptor); (* EditConst *)
  1085.  
  1086.   Init; (* KeyBase *)
  1087.   
  1088.   (* ScreenBase: *)
  1089.  
  1090.   CursorAn := FALSE;
  1091.   CursorBlink := FALSE;
  1092.   MausForm := arrow;
  1093.   InitAES;
  1094.   WrapOff;      (* Automatischen Zeilenumbruch ausschalten *)
  1095.   MausIstSichtbar := TRUE;
  1096.   alteBlinkrate := ConfigureCursor (5, -1);
  1097.   altesAttribut := alteBlinkrate MOD 256;
  1098.   alteBlinkrate := alteBlinkrate DIV 256;
  1099.  
  1100.   LoescheBild;
  1101.   GotoXY (20, 10); WriteConst (ceditor);
  1102.   
  1103.   GotoXY (15, 12); WriteConst (   '(C) 1987, 1988, 1989, 1990 by Johannes Leckebusch');
  1104.   GotoXY (15, 13); WriteConst (   '*************************************************');
  1105.   GotoXY (0,0); WriteLn;
  1106.     
  1107.   MausEin;
  1108.   oldx := 0; oldy := 0;
  1109.   OldKnoepfe := ButtonSet {};
  1110.  
  1111.   Trace ('ScreenBase ready');
  1112.   WITH topbox DO
  1113.     x := 0; y := CharHeight + 3;
  1114.     w := ScreenWidth; h := CharHeight - 4;
  1115.   END (* WITH *);
  1116.   TopBox;
  1117.  
  1118.   Version (version); (* Früher in EditDirectory *)
  1119.  
  1120. (* BEGIN (* EditBase *); *)
  1121.  
  1122.   DoClipboard := FALSE; (* Früher in EditCommand!!! *)
  1123.   AutoCount := 0;
  1124.   Trace ('GMEBase ready!');
  1125.  
  1126. END GMEBase.
  1127.